package probe.sound.code;

import org.testng.Assert;
import org.testng.annotations.Test;

public class UtilTest {
  @Test
  public void readInt4_Little1() {
    byte[] buf = new byte[5];
    buf[1] = 1;
    buf[2] = 0;
    buf[3] = 0;
    buf[4] = 0;
    
    int readInt = Util.readInt4( buf, 1, true );
    Assert.assertEquals( readInt, 1 );
  }
  
  @Test
  public void writeInt4() {
    int values[] = new int[] { 0, 1, -1, 100, -100, 65539, -65539, 10000000, -10000000 };
    byte[] buf = new byte[51];
    for (int offset : new int[] { 0, 2, 10 }) {
      for (int value : values) {
        
        for (int i = 0; i < buf.length; i++) {
          buf[i] = 0;
        }
        {
          Util.writeInt4( buf, offset, true, value );
          int actualValue = Util.readInt4( buf, offset, true );
          Assert.assertEquals( actualValue, value );
        }
        {
          Util.writeInt4( buf, offset, false, value );
          int actualValue = Util.readInt4( buf, offset, false );
          Assert.assertEquals( actualValue, value );
        }
      }
    }
  }
  
  @Test
  public void readInt4_Little2() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 1;
    buf[3] = 0;
    buf[4] = 0;
    
    int readInt = Util.readInt4( buf, 1, true );
    Assert.assertEquals( readInt, 256 );
  }
  
  @Test
  public void readInt4_Little3() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 0;
    buf[3] = 1;
    buf[4] = 0;
    
    int readInt = Util.readInt4( buf, 1, true );
    Assert.assertEquals( readInt, 65536 );
  }
  
  @Test
  public void readInt4_Little4() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 0;
    buf[3] = 0;
    buf[4] = 1;
    
    int readInt = Util.readInt4( buf, 1, true );
    Assert.assertEquals( readInt, 16777216 );
  }
  
  @Test
  public void readInt4_Big1() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 0;
    buf[3] = 0;
    buf[4] = 1;
    
    int readInt = Util.readInt4( buf, 1, false );
    Assert.assertEquals( readInt, 1 );
  }
  
  @Test
  public void readInt4_Big2() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 0;
    buf[3] = 1;
    buf[4] = 0;
    
    int readInt = Util.readInt4( buf, 1, false );
    Assert.assertEquals( readInt, 256 );
  }
  
  @Test
  public void readInt4_Big3() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 1;
    buf[3] = 0;
    buf[4] = 0;
    
    int readInt = Util.readInt4( buf, 1, false );
    Assert.assertEquals( readInt, 65536 );
  }
  
  @Test
  public void readInt4_Big4() {
    byte[] buf = new byte[5];
    buf[1] = 1;
    buf[2] = 0;
    buf[3] = 0;
    buf[4] = 0;
    
    int readInt = Util.readInt4( buf, 1, false );
    Assert.assertEquals( readInt, 16777216 );
  }
  
  @Test
  public void readInt4_Little_1() {
    byte[] buf = new byte[5];
    buf[1] = -1;
    buf[2] = -1;
    buf[3] = -1;
    buf[4] = -1;
    
    int readInt = Util.readInt4( buf, 1, true );
    Assert.assertEquals( readInt, -1 );
  }
  
  @Test
  public void readInt4_Big_1() {
    byte[] buf = new byte[5];
    buf[1] = -1;
    buf[2] = -1;
    buf[3] = -1;
    buf[4] = -1;
    
    int readInt = Util.readInt4( buf, 1, true );
    Assert.assertEquals( readInt, -1 );
  }
  
  @Test
  public void readInt4_LittleNeg() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 0;
    buf[3] = 0;
    buf[4] = -1;
    
    int readInt = Util.readInt4( buf, 1, true );
    Assert.assertEquals( readInt, -16777216 );
  }
  
  @Test
  public void readInt4_BigNeg() {
    byte[] buf = new byte[5];
    buf[1] = -1;
    buf[2] = 0;
    buf[3] = 0;
    buf[4] = 0;
    
    int readInt = Util.readInt4( buf, 1, false );
    Assert.assertEquals( readInt, -16777216 );
  }
  
  @Test
  public void readWord_Little1() {
    byte[] buf = new byte[5];
    buf[1] = 1;
    buf[2] = 0;
    buf[3] = 0;
    buf[4] = 0;
    
    int readInt = Util.readWord( buf, 1, true );
    Assert.assertEquals( readInt, 1 );
  }
  
  @Test
  public void readWord_Little2() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 1;
    buf[3] = 0;
    buf[4] = 0;
    
    int readInt = Util.readWord( buf, 1, true );
    Assert.assertEquals( readInt, 256 );
  }
  
  @Test
  public void readWord_Big1() {
    byte[] buf = new byte[5];
    buf[1] = 0;
    buf[2] = 1;
    
    int readInt = Util.readWord( buf, 1, false );
    Assert.assertEquals( readInt, 1 );
  }
  
  @Test
  public void readWord_Big2() {
    byte[] buf = new byte[5];
    buf[1] = 1;
    buf[2] = 0;
    
    int readInt = Util.readWord( buf, 1, false );
    Assert.assertEquals( readInt, 256 );
  }
  
  @Test
  public void asHex() {
    Assert.assertEquals( Util.asHex( (byte)10 ), "0A" );
    Assert.assertEquals( Util.asHex( (byte)16 ), "10" );
    Assert.assertEquals( Util.asHex( (byte)-1 ), "FF" );
    Assert.assertEquals( Util.asHex( (byte)-100 ), "9C" );
  }
  
  @Test
  public void toSignedWord() {
    Assert.assertEquals( Util.toSignedWord( 0.5 ), 16384 );
    Assert.assertEquals( Util.toSignedWord( -0.5 ), -16384 );
    Assert.assertEquals( Util.toSignedWord( 0.51 ), 16711 );
    Assert.assertEquals( Util.toSignedWord( -0.51 ), -16712 );
    Assert.assertEquals( Util.toSignedWord( 1.0 - 0.000001 ), 32767 );
    Assert.assertEquals( Util.toSignedWord( -1.0 + 0.000001 ), -32768 );
  }
}
